import Request from '@/utils/luch-request/luch-request'
import zfy from "@/utils/index.js"
// 当前接口请求数
let requestNum = 0
// 初始化请求插件
const luchRequest = new Request({
	// 接口请求地址
	// 正式域名
	// baseURL: 'https://shop.carhousekeep.com',
	// 测试域名
	baseURL: 'https://ticket.sxd.cn/',
	// 设置请求头部
	header: {
		"Content-Type": "application/x-www-form-urlencoded",
		'x-requested-with': 'XMLHttpRequest',
	},
	// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
	timeout: 15000, // 设置请求超时
	// #endif
	// 自定义请求参数
	custom: {
		// 是否自动提示错误
		isPrompt: true,
		// 是否显示加载动画
		load: false,
		// 是否使用数据工厂
		isFactory: true
	}
})
// 请求拦截器
luchRequest.interceptors.request.use((config) => {
	if (vk.getVuex("$gl.token") !== '' || vk.getVuex("$gl.token") !== undefined) {
		config.header['Authorization'] = `${vk.getVuex('$gl.token.token')}`
	}
	if (config.custom && config.custom.load) {
		if (requestNum <= 0) {
			// noinspection JSIgnoredPromiseFromCall
			uni.showLoading({
				title: '加载中',
				mask: true
			})
		}
		requestNum += 1
	}
	return config

}, (config) => Promise.reject(config))

// 响应拦截器
luchRequest.interceptors.response.use(async (response) => {
	// 当前请求用户自定义参数
	const isLoad = response.config.custom && response.config.custom.load;
	const isPrompt = response.config.custom && response.config.custom.isPrompt;
	const isFactory = response.config.custom && response.config.custom.isFactory;
	// 当前接口是否启用加载动画
	if (isLoad) {
		requestNum = requestNum - 1
		if (requestNum <= 0) {
			uni.hideLoading()
		}
	}
	// 状态码异常检查
	if (!response.statusCode || response.statusCode !== 200) {
		return Promise.reject({
			statusCode: response.statusCode,
			errMsg: 'HTTP状态码错误'
		})
	}

	// 自定义检查登录是否失效
	if (response.data.code == 101) {
		await zfy.codeLogin()
	}
	// 获取响应并处理
	let httpData = response.data
	if (typeof httpData == "string") {
		try {
			httpData = JSON.parse(httpData)
		} catch {
			httpData = false
		}
	}

	// 无法解析返回的数据
	if (httpData === false || typeof httpData !== 'object') {
		// 返回错误的结果(catch接受数据)
		return Promise.reject({
			statusCode: response.statusCode,
			errMsg: "返回数据格式异常"
		})
	}

	// 返回接口请求的数据
	if (httpData.status === 200) {
		return Promise.resolve(httpData)
	}
	// 后端返回异常状态
	if (httpData.status === 500) {
		if (isPrompt) {
			setTimeout(() => {
				// noinspection JSIgnoredPromiseFromCall
				uni.showToast({
					title: httpData.message,
					icon: "none",
					duration: 2500
				})
			})
		}

		// 在调用侧仍可以感知和处理错误
		return Promise.reject({
			statusCode: 0,
			errMsg: httpData.message,
			result: httpData
		})
	}

	return response.data;

}, (response) => Promise.reject(response))

// 返回准备好的请求插件
export default luchRequest;